package com.rimi.util;

/**
 * @
 * @author:liangLi
 * @time:2020/7/6 17:08
 */


import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.util.Base64;

/*
 *  	给定一个字符串，实现对该字符串进行加密，和解密
 */
public class DESUtil {

    // 提供一个加密的算法
    private static String algorithmType = "DES";
    // 提供一个秘钥字符串
    private static String key = "rimi";
    // 加密对象
    private static Cipher cipher = null;
    // 秘钥对象
    private static SecretKey  securekey = null;

    static {
        try {
            // 根据算法名称，获取一个加密对象的实例
            cipher = Cipher.getInstance(algorithmType);
            // 根据秘钥字符串，生成一个用来进行加密的秘钥
            // 秘钥字符串必须是8的倍数，如果不是，需要强转为8的倍数，如果使用base64转为64的倍数，请不要超过64位。
            DESKeySpec desKey = new DESKeySpec(Base64.getEncoder().encode(key.getBytes()));
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithmType);
            securekey = keyFactory.generateSecret(desKey);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static String encode(String encode)  {
        if(null == encode) {
            return null;
        }

        byte[] res = null;

        try {
            // 初始化加密对象，ENCRYPT_MODE代表加密模式
            cipher.init(Cipher.ENCRYPT_MODE,securekey);
            // 执行加密
            res = cipher.doFinal(encode.getBytes());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 加密完成，转化成8的倍数 ，利用Base64编码
        return new String(Base64.getEncoder().encode(res));

    }

    public static String decode(String decode) {
        if(null == decode) {
            return null;
        }
        byte[] res = null;
        try {
            // 初始化加密对象，DECRYPT_MODE代表解密模式
            cipher.init(Cipher.DECRYPT_MODE,securekey);
            // 进行解密，解密时候注意，解密的字符串，必须是8的倍数，利用Base64解码
            res = cipher.doFinal(Base64.getDecoder().decode(decode));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return new String(res);
    }


}